package me.zhangyifeng.blog.service;

import java.util.List;

import com.github.pagehelper.PageInfo;
import me.zhangyifeng.blog.model.domain.Article;
import me.zhangyifeng.blog.model.domain.ArticleCustom;
import me.zhangyifeng.blog.model.domain.Category;
import me.zhangyifeng.blog.model.domain.Tag;
import me.zhangyifeng.blog.model.dto.ArchiveBo;
import me.zhangyifeng.blog.model.dto.JsonResult;

/**
 * @author : 宋浩志
 * @createDate : 2018年10月15日
 */
public interface ArticleService {
	/**
	 * 保存文章
	 *
	 * @param article
	 *            文章
	 * @param tagsName
	 *            标签id
	 * @param categorys
	 *            分类id
	 */
	void insert(Article article, Long[] tagsName, Long[] categorys);

	/**
	 * 不分页查询所有文章
	 *
	 * @param status
	 * @param post
	 * @return
	 */
	List<ArticleCustom> findAllArticle(int status, String post);

	/**
	 * 分页查询所有文章
	 *
	 * @param limit
	 * @param page
	 * @param articleCustom
	 *            文章对象
	 * @return
	 */
	PageInfo<ArticleCustom> findPageArticle(int page, int limit, ArticleCustom articleCustom);
	/**
	 * 状态统计条数
	 *
	 * @param status
	 *            状态
	 * @param post
	 *            类型
	 * @return
	 */
	Integer countByStatus(Integer status, String post);
	
	/**
	 * 根据状态和用户ID统计条数
	 *
	 * @param status
	 *            状态
	 * @param post
	 *            类型
	 * @param userId
	 *            用户ID (为null时查询所有用户)
	 * @return
	 */
	Integer countByStatusAndUserId(Integer status, String post, Integer userId);

	/**
	 * 修改文章状态为回收站
	 *
	 * @param id
	 */
	void remove(int id);

	/**
	 * 修改文章状态为回收站
	 *
	 * @param id
	 * @param integer
	 */
	void recycle(int id, Integer integer);

	/**
	 * id查询文章
	 *
	 * @param article_id 文章ID
	 * @return 返回查询到的文章信息，若未找到则返回null
	 */
	ArticleCustom findByArticleId(Integer article_id);

	/**
	 * 修改文章
	 *
	 * @param article
	 * @param tags
	 *            标签id
	 * @param categorys
	 *            分类id
	 * @throws Exception
	 */
	void update(Article article, Long[] tags, Long[] categorys);
	/**
	 * 归档
	 *
	 * @return
	 */
	List<ArchiveBo> archives();
		/**
	 * 获取最新的文章（按发布时间排序）
	 * 
	 * @param limit
	 *            条数
	 * @return
	 */
	List<ArticleCustom> findLatestArticles(int limit);
	
	/**
	 * 获取热门文章（按访问量排序）
	 * 
	 * @param limit
	 *            条数
	 * @return
	 */
	List<ArticleCustom> findHotArticles(int limit);

	/**
	 * 统计重复链接
	 *
	 * @param articleUrl
	 *            文章链接
	 * @return
	 */
	int findRepeatByUrl(String articleUrl);

	/**
	 * 文章链接查询
	 *
	 * @param articleUrl
	 * @return 文章
	 */
	ArticleCustom findByArticleUrl(String articleUrl);

	/**
	 * 分页查询分类下的所有文章
	 *
	 * @param page
	 * @param limit
	 * @param category
	 * @param status 文章状态
	 * @return
	 */
	PageInfo<ArticleCustom> findArtileByCategory(int page, int limit, Category category, int status);

	/**
	 * 分页查询标签下的所有文章
	 *
	 * @param page
	 * @param limit
	 * @param tag
	 * @param status 文章状态
	 * @return
	 */
	PageInfo<ArticleCustom> findArtileByTag(Integer page, Integer limit, Tag tag, int status);

	/**
	 * 标题分页搜索文章
	 *
	 * @param keywords
	 * @param page
	 * @param limit
	 * @return
	 */
	PageInfo<Article> findArticleByKeywords(String keywords, Integer page, Integer limit);	/**
	 * 修改文章点击数
	 * @param article
	 */
	void updateArticleViews(Article article);

	/**
	 * 按状态和用户ID统计文章数量
	 *
	 * @param status 状态
	 * @param post 类型
	 * @param userId 用户ID
	 * @return 文章数量
	 */

    JsonResult save(Article article, Long[] tags, Long[] categorys);
}
